"""
3. 常用爬虫技术
    （1）请求库：
        （1）requests：简洁、强大的HTTP库，支持HTTP连接保持和连接池，支持SSL证书验证、Cookies等。
        （2）aiohttp：基于asyncio的异步HTTP网络库，适用于需要高并发的爬虫场景。
    （2）解析库：如BeautifulSoup、lxml、PyQuery等，用于解析网页内容。
        （1）BeautifulSoup：一个HTML和XML的解析库，简单易用，支持多种解析器。
        （2）lxml：一个高效的XML和HTML解析库，支持XPath和CSS选择器。
        （3）PyQuery：一个Python版的jQuery，语法与jQuery类似，易于上手。
    （3）存储库：如pandas、SQLite等，用于存储爬取到的数据。
        （1）pandas：一个强大的数据分析库，提供数据结构和数据分析工具，支持多种文件格式。
（       2）SQLite：一个轻量级的数据库，支持SQL查询，适用于小型爬虫项目。
    （4）异步库：如asyncio、aiohttp等，用于实现异步爬虫，提高爬取效率。

"""


# 需求： 爬取豆瓣电影TOP250的电影名称、评分、导演等信息
import requests
from bs4 import BeautifulSoup
import pandas as pd

from lxml import etree
from pyquery import PyQuery as pq
import sqlite3

# 豆瓣电影TOP250的基础URL
base_url = 'https://movie.douban.com/top250'

# 定义一个函数来获取页面内容
def get_page_content(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        print('请求页面失败:', response.status_code)
        return None

# 定义一个函数来解析页面内容
def parse_page_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    movie_list = soup.find_all('div', class_='item')
    movies = []
    for movie in movie_list:
        title = movie.find('span', class_='title').get_text()
        rating = movie.find('span', class_='rating_num').get_text()
        director = movie.find('p', class_='').get_text()
        movies.append({'title': title, 'rating': rating, 'director': director})
        # movies.append({'title': title, 'rating': rating})

    return movies

# 定义一个函数来保存数据到CSV文件
def save_to_csv(movies):
    df = pd.DataFrame(movies)
    df.to_csv('../File/douban_top250.csv', index=False, encoding='utf_8_sig')

# 主函数，用于运行爬虫
def main():
    movies = []
    for i in range(0, 250, 25):  # 豆瓣电影TOP250分为10页，每页25部电影
        url = f'{base_url}?start={i}&filter='
        html = get_page_content(url)
        if html:
            movies.extend(parse_page_content(html))
    save_to_csv(movies)
    print('爬取完成，数据已保存到douban_top250.csv')


def getJob():
    # 创建或连接SQLite数据库
    conn = sqlite3.connect('job.db')
    cursor = conn.cursor()
    # 创建职位信息表
    cursor.execute(
        'CREATE TABLE IF NOT EXISTS job (id INTEGER PRIMARY KEY, title TEXT, salary TEXT, company TEXT, location TEXT)')
    # 分析网站结构后得到的职位列表URL
    url = 'https://www.example.com/jobs'
    # 发送HTTP请求获取职位列表
    params = {
        'page': 1,  # 假设页面参数为page，这里请求第1页
        'city': 'beijing'  # 假设城市参数为city，这里请求北京地区的职位
    }
    response = requests.get(url, params=params)
    response.encoding = 'utf-8'  # 设置字符编码，防止乱码
    # 使用lxml解析职位列表，提取职位详情页URL
    html = etree.HTML(response.text)
    job_list = html.xpath('//div[@class="job-list"]/ul/li/a/@href')  # 假设职位详情页URL在a标签的href属性中
    # 遍历职位详情页URL，爬取职位信息
    for job_url in job_list:
        job_response = requests.get(job_url)
        job_response.encoding = 'utf-8'
        job_html = pq(job_response.text)
        # 使用PyQuery解析职位详情页，提取职位信息
        title = job_html('.job-title').text()  # 假设职位名称在class为job-title的元素中
        salary = job_html('.job-salary').text()  # 假设薪资信息在class为job-salary的元素中
        company = job_html('.job-company').text()  # 假设公司名称在class为job-company的元素中
        location = job_html('.job-location').text()  # 假设工作地点在class为job-location的元素中
        # 存储职位信息到SQLite数据库
        cursor.execute('INSERT INTO job (title, salary, company, location) VALUES (?, ?, ?, ?)',
                       (title, salary, company, location))
        conn.commit()
    # 关闭数据库连接
    cursor.close()
    conn.close()


# 运行主函数
if __name__ == '__main__':
    main()

